#include "mprpcconfig.h"
#include <iostream>

void  MprpcConfig::LoadConfigfile(const char* config_file)
{
    FILE* pf = fopen(config_file, "r");
    if (pf == nullptr)
    {
        std::cout << config_file << "is not exist!" << std::endl;
        exit(EXIT_FAILURE);
    }

    // 不断读取内容 
    //      1.注释      2.正确配置项     3.去除开头多余空格
    while (!feof(pf))
    {
        char buf[512] = {0};
        fgets(buf, 512, pf);

        std::string read_buf(buf);
        
        // 去除前后空格 
        Trim(read_buf);

        // 判断为注释 或者 全为空格的空行
        if (read_buf[0] == '#' || read_buf.empty()) 
        {
            continue;
        }

        // 解析配置项
        int idx = read_buf.find('=');
        if (idx == -1) 
        {   // 配置项不合法
            continue;
        }

        std::string key;
        std::string value;

        // substr() 参数 第一个为其实下表 第二个为长度 
        key = read_buf.substr(0, idx);
        Trim(key);
        int endidx = read_buf.find("\n", idx);
        value = read_buf.substr(idx + 1, endidx - idx - 1);
        Trim(value);
        m_configMap[key] = value;
    }

    // 关闭文件 
    fclose(pf);
}

std::string MprpcConfig::Load(const std::string& key)
{
    auto it = m_configMap.find(key);
    if (it == m_configMap.end())
    {   // key-value 不存在 
        return std::string();
    }
    return it->second;
}

void MprpcConfig::Trim(std::string& src_buf)
{
    // 去掉前面多余空格 
    int idx = src_buf.find_first_not_of(' ');
    if (idx != -1) 
    {
        // 表示前面有空格         函数第二个参数是子串的长度
        src_buf = src_buf.substr(idx, src_buf.size() - idx);
    }

    // 去除后面的空格
    idx = src_buf.find_last_not_of(' ');
    if (idx != -1)
    {
        src_buf = src_buf.substr(0, idx + 1); 
    }
}